/**任意参数个数，任意返回值的函数 */
type Fn = (...param: any[]) => any

//好像不需要绑定this



/**防抖。主要思想是，短时间内触发的多个函数，只执行最后一次(等待指定时间后执行)。会刷新等待时间。  （搜索框联想）
 * @param func 要防抖的函数。调用return的函数时传参，可以在这里接收到
 * @param time 防抖的时间，毫秒
 * @returns 返回一个函数，可以用来绑定事件。调用时可以给这个函数传参
 */
export const debounce = <T extends Fn>(func: T, time: number): T => {
    let timer: NodeJS.Timeout
    return function (this: any, ...argu: [any]) {
        const context = this;
        clearTimeout(timer)
        timer = setTimeout(() => {
            func.apply(context, ...argu) //通过剩余参数的形式传递
        }, time);
    } as T
}
/**节流。思想是一段时间内多次触发，只执行一次  （按很多下平a只触发一次）
 * @param func 要触发的函数。调用return的函数时传的参，可以在这里接收到
 * @param time 时间间隔。毫秒
 * @returns 返回一个函数，可以用于绑定事件。调用时可以给这个函数传参
 */
export const throttle = <T extends Fn>(func: T, time: number): T => {

    /**节流阀 */
    let flag = false
    return function (this: any, ...argu: [any]) {
        if (flag) return
        console.log(flag);
        const context = this;
        flag = true
        func.apply(context, ...argu) //通过剩余参数的形式传递
        setTimeout(() => {//指定时间间隔后关闭节流阀
            flag = false
        }, time);
    } as T
}
